package cn.iocoder.yudao.module.contract.service.orderContract;

import java.util.*;
import javax.validation.*;

import cn.iocoder.yudao.module.contract.controller.admin.frameworkAgreement.vo.FrameworkAgreementSaveReqVO;
import cn.iocoder.yudao.module.contract.controller.admin.orderContract.vo.*;
import cn.iocoder.yudao.module.contract.dal.dataobject.frameworkAgreement.FrameworkAgreementDO;
import cn.iocoder.yudao.module.contract.dal.dataobject.order.OrderDO;
import cn.iocoder.yudao.module.contract.dal.dataobject.orderContract.OrderContractDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.module.contract.dal.dataobject.orderContract.vo.CompanyOrderContractVO;
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * 订单合同 Service 接口
 *
 * @author 管理员
 */
public interface OrderContractService extends IService<OrderContractDO> {

    /**
     * 创建订单合同
     *
     * @param order 创建信息
     * @return 编号
     */
    void createOrderContract(@Valid OrderDO order);

    /**
     * 更新订单合同
     *
     * @param updateReqVO 更新信息
     */
    void updateOrderContract(@Valid OrderContractSaveReqVO updateReqVO);

    /**
     * 删除订单合同
     *
     * @param id 编号
     */
    void deleteOrderContract(Long id);

    /**
     * 获得订单合同
     *
     * @param id 编号
     * @return 订单合同
     */
    OrderContractDO getOrderContract(Long id);

    /**
     * 获得订单合同分页
     *
     * @param pageReqVO 分页查询
     * @return 订单合同分页
     */
    PageResult<OrderContractPageRespVO> getOrderContractPage(OrderContractPageReqVO pageReqVO);

    void fileUpload(OrderContractSaveReqVO updateReqVO);

    void generateContractFile(OrderContractDO orderContractDO);

    /**
     * 冻结订单合同
     *
     * @param id
     * @return
     */
    boolean orderContractFreeze(long id);

    /**
     * 释放订单合同
     *
     * @param id
     * @return
     */
    boolean orderContractRelease(long id);

    /**
     * 获取未上传合同附件的订单合同
     *
     * @return
     */
    List<OrderContractDO> listUnUploadContractFile();

    /**
     * 获取在指定日期三个月内的订单合同信息
     *
     * @param intervalDate
     * @param excludeContractIds 排查的合同Id
     * @return
     */
    List<CompanyOrderContractVO> listCompanyOrderContract(String clientCode,String intervalDate, List<Long> excludeContractIds);

}